package com.qupai.lib_base.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicYuvToRGB;
import android.renderscript.Type;

public class NV21ToBitmap {

    private final RenderScript rs;

    private final ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic;

    private Type.Builder yuvType;

    private Allocation in, out;

    public NV21ToBitmap(Context context) {

        rs = RenderScript.create(context);

        yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));
    }

    public Bitmap nv21ToBitmap(byte[] nv21, int width, int height) {

        if (yuvType == null) {

            yuvType = new Type.Builder(rs, Element.U8(rs)).setX(nv21.length);

            in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);

            Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(width).setY(height);

            out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);

        }

        in.copyFrom(nv21);

        yuvToRgbIntrinsic.setInput(in);

        yuvToRgbIntrinsic.forEach(out);

        Bitmap bmpout = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        out.copyTo(bmpout);

        return bmpout;

    }

}